﻿<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
	"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<title>Технологии J2EE. Разработка системы управления ACM-ICPC олимпиадами.</title>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<style type="text/css">
		p {
			text-indent: 2em;
			margin: .4em;
		}

		li {
			margin: 0;
			padding: 0;

		}

		img {
			float: right;
		}

		pre {
			font-weight: bold;
		}
	</style>
</head>

<body>
<div style="text-align: right">
	<b>Курсовая работа</b><br>
	<b>Выполнил</b>: Лазерко Дмитрий Викторович,<br>
	студент 2 курса, ММФ БГУ, 6 группа<br>
	<b>Проверил</b>: Суздаль Станислав Валерьевич,<br>
	доцент кафедры ЧМиП, ММФ, БГУ.<br>
	<br>
	2006-05-22<br>

</div>

<h1 align="center">
	Технологии J2EE.<br>
	Разработка системы управления ACM-ICPC олимпиадами.
</h1>

<hr>

<h2>Содержание.</h2>
<ul>
	<li><a href="#intro">Введение</a></li>
	<li><a href="#chapterServlet">Глава 1. Java Servlet.</a></li>
	<li><a href="#chapterJsp">Глава 2. Технологии Java Server Pages и Java Server Pages Standart Tag 
Library.</a></li>
	<li><a href="#chapterStruts">Глава 3. Struts Action Framework.</a></li>
	<li><a href="#chapterJdbc">Глава 4. Java DataBase Connectivity.</a></li>
	<li><a href="#chapterPostgresql">Глава 5. PostgreSQL</a></li>
	<li><a href="#chapterUse">Глава 6. Использование этих инструментов в процессе разработки.</a></li>
	<li><a href="#chapterForever">Глава 7. Дальнейшее развитие проекта.</a></li>
	<li><a href="#chapterSummary">Заключение</a></li>
	<li><a href="#enclosureCode">Приложение A: Исходный код проекта JudgeOS.</a></li>
</ul>

<h2>
	<a name="intro">Введение.</a>
</h2>
<ul>
	<li>
		<h3>
			Цели данной работы.
		</h3>

		<p>
			Изучить технологии J2EE на примере создания системы управления ACM-ICPC олимпиадой.
		</p>
	</li>
	<li>
		<h3>J2EE</h3>

		<p>
			<a href="http://java.sun.com/javaee/">Java 2 Enterprise Edition</a>, сокращенно J2EE -- набор 
спецификаций и
			соответствующей документации для языка Java, описывающей архитектуру серверной платформы для задач 
средних и
			крупных предприятий.
		</p>

		<p>
			Спецификации детализированы настолько, чтобы обеспечить переносимость программ c одной реализации 
платформы
			на другую. Основная цель спецификаций -- обеспечить масштабируемость приложений и целостность данных во
			время работы системы. J2EE во многом ориентирована на использование её через веб как в интернете, так и 
на
			локальных сетях. Вся спецификация создаётся и утверждается через JCP (Java Community Process) в рамках
			инициативы Sun Microsystems Inc.
		</p>

		<p>
			Платформу J2EE используют в настоящее время большинство банков и крупных корпораций для организации
			веб-порталов и предоставления услуг онлайн, особенно если необходимо обеспечить бесперебойную работу 
многих
			тысяч пользователей.
		</p>

		<p>
			Более подробное описание некоторых пакетов и технологий J2EE, использованных в данной работе, будет
			приведено
			ниже в главах 1-4.
		</p>
	</li>
	<li>
		<h3>ACM-ICPC</h3>
		<img src="outsideImages/icpc_logo.png" alt="ACM-ICPC Logo" title="ACM-ICPC Logo">

		<p>
			<a href="http://icpc.baylor.edu/icpc/">ACM-ICPC (Association for Computer Machinery - International
				Collegiate Programming Contest)</a> -- крупнейшая студенческая командная олимпиада по 
программированию.
			Организатором олимпиады является влиятельная в компьютерном мире организация Association for Computer
			Machinery (ACM), а спонсорами соревнований в последние годы являлись компании IBM и Microsoft. Своими
			корнями чемпионат уходит в соревнование, проводившееся в Техасском университете в 1970. Свой нынешний 
облик
			чемпионат принял в 1977, когда первый финал был проведен в рамках научной конференции ACM, и с тех пор
			проводится ежегодно.
		</p>

		<p>
			Тур олимпиады происходит следующим образом: каждой команде выдаётся компьютер и от шести до шестнадцати
			задач на пять часов. Команды пишут решения на алгоритмический язык C, C++, Паскале или Java и посылают 
их на
			тестирующий сервер. Программы тестируются на большом количестве различных входных тестов, неизвестных
			участникам. Если программа выдала неправильный ответ или не уложилась в ограничения по времени или 
памяти,
			то пославшая её команда получает об этом сообщение и может послать исправленную версию. Задача считается
			решённой, если программа выдала правильные ответы на всех тестах. В отличие от других олимпиад, 
частичные
			решения не учитываются.
		</p>

		<p>
			Побеждает команда, решившая правильно наибольшее число задач. Если несколько команд решают одинаковое
			количество задач, то их положение в рейтинге определяется штрафным временем. Изначально штрафное время
			каждой команды равно нулю. За каждую правильно сданную задачу к штрафному времени команды прибавляют 
время,
			прошедшее с начала соревнования до момента сдачи задачи. Кроме того, если зачтённой попытке 
предшествовало
			несколько неудачных попыток сдать ту же задачу, то за каждую из них к штрафному времени прибавляют 
двадцать
			минут. За неудачные попытки сдать задачу, которую команде в итоге так и не удалось решить, штрафного 
времени
			не начисляется.
		</p>
	</li>
	<li>
		<h3>Системы управления ACM-ICPC олимпиадами.</h3>

		<p>
			Для того, чтобы обеспечивать проведение олимпиады по правилам ICPC, очевидно, необходим некий 
"электронный
			судья",
			система, обрабатывающая в реальном времени запросы на проверку решений команд-участников,
			ведущая статистику прогресса соревнования команд,
			предоставляющая администраторский, жюри и наблюдательский доступ к олимпиаде.
			В настоящий момент нет некей унифицированнай или хотя бы лидирующей такогй системы.
			Олимпиады проводятся с использованием различных, несовместимых друг с другом, часто самописных 
программах.
			Причем в большинстве своем такие системы не распространяются либо распространяются с закрытым кодом.
		</p>

		<p>
			В последнее время, в связи с увеличением интереса к проводимым на Механико-Математическом факультете БГУ
			тренировках по информатике, возникла потребность в использовании такой системы при и
			проведении тренировок ММФ. Проанализировав имеющиеся в доступе системы, организаторы тренировок
			пришли к выводу, что качество, условия распространения/использования либо узконаправленность таких 
систем не
			удовлетворяет потребностям Механико-Математического факультета БГУ. Поэтому было принято решение 
разработать
			такую систему на базе своего факультета в рамках курсовой/дипломной работы. Было также решено выбрать 
как
			платформу
			для разработки платформу Java EE 5 SDK, и определить условия распространения/использования системы
			в рамках лицензии <a href="http://www.gnu.org/copyleft/gpl.html">GNU General Public License (GPL)</a>
		</p>

		<p>
			В процессе разработки для проекта было выбрано название <b>JudgeOS</b> (Judge Open Source), как 
официальный
			сайт проекта -- домен <a href="http://www.judgeos.org/">www.judgeos.org</a> и
			<a href="http://judgeos.org/">judgeos.org</a> (на данный момент незаригистрированы).
		</p>
	</li>
</ul>

<h2>
	<a name="chapterServlet">Глава 1. Java Servlet.</a>
</h2>
<img src="outsideImages/servlet_api_vs_cgi504x360.gif" alt="Servlet API vs CGI" title="Servlet API vs CGI"/>

<p>
	<a href="http://java.sun.com/products/servlets">Java Servlet</a> API позволяет разработчику программного 
обеспечения
	добавлять динамический контент в web-сервер, используя Java-платформу. Генерируемые данные -- это обычно HTML, 
но
	может быть любыми другими данными, например XML. Сервлеты сродни другим технологиям генерации динамического
	web-контента, таким как, например, CGI, PHP и ASP.
</p>

<p>
	Servlet API, содержащийся в Java-пакете javax.servlet, определяет ожидаемое взаимодействие web-контейнера с
	сервлетом. По существу, web-контейнер -- это часть web-сервера, взаимодействующая с сервлетами.
</p>

<p>
	Servlet -- это объект, который получает запросы (ServletRequest) и генерирует по нему ответ (ServletResponse).
	API-пакет javax.servlet.http определяет HTTP-подклассы обобщенного сервлета(HttpServlet),
	запроса(HttpServletRequest), ответа(HttpServletResponse), и сессии (HttpSession). Сервлеты могут быть упакованы 
в
	WAR-файл как web-приложение.
</p>

<p>
	Кроме того, сервлеты могуть быть автоматически генерируемыми JSP-страницами или другими обработчиками шаблонов.
	Часто сервлеты используются в связке с JSP-страницами, по так называемому "Model 2" шаблону, разновидностью
	Model-View-Controller шаблона.
</p>

<h2>
	<a name="chapterJsp">
		Глава 2. Технологии Java Server Pages и Java Server Pages Standart Tag Library
	</a>
</h2>

<p>
	<a href="http://java.sun.com/products/jsp">JSP (Java Server Pages)</a> -- технология, позволяющая 
веб-разработчикам
	динамически генерировать HTML, XML и другие веб-страницы. Технология позволяет внедрять Java-код, а также EL
	(expression language) в статичное содержимое страницы. Также могут использоваться библиотеки JSP тегов для 
внедрения
	их в JSP-cтраницы. Страницы компилируются JSP-компилятором в сервлеты, представляющие собой Java-классы, которые
	выполняются на сервере. Сервлеты также могут быть написаны разработчиком, не используя JSP-страницы. Эти 
технологии
	могут дополнять друг друга.
</p>

<p>
	JSP -- одна из высокопроизводительных технологий, т. к. весь код страницы транслируется в java-код сервлета с
	помощью компилятора JSP страниц Jasper, и затем компилируется в байт-код виртуальной машины java (JVM).
	Сервлет-контейнеры (Tomcat), способные исполнять JSP страницы, написаны на платформонезависимом языке Java, 
который
	может работать под различными операционными системами и на компьютерах с разной архитектурой, от персональных
	компьютеров до высокопроизводительных серверов. Сервлет-контейнеры могут работать как полноценные 
самостоятельные
	веб-серверы, работать поставщиком страниц для другого веб-сервера или интегрироваться в J2EE сервер приложений.
</p>

<p>
	<a href="http://java.sun.com/products/jsp/jstl/">JSTL</a> (Java Server Pages Standart Tag Library -- библиотека
	стандартных тегов JSP) -- это часть платформы разработки
	Java EE web-приложения. Она расширяет JSP-спецификацию, добавляя библиотеку тегов для частых задач, таких как
	обработка XML,
	выполнения по условию, циклов и интернационализации. JSTL была разработана в процессе Java Community Process 
(JCP)
	как JSR 52.
</p>

<p>
	JSTL предлагает эффективный путь встраивания логики в JSP-страницу без прямой вставки Java-кода. Использование
	стандартизированного набора тегов, в отличие от подмешивания Java-кода, приводит к более легкому в поддержке 
коду,
	и дает возможность разделения подходов к разработке кода приложения и пользовательского интерфейса.
</p>

<h2>
	<a name="chapterStruts">Глава 3. Struts Action Framework.</a>
</h2>
<img src="outsideImages/J2eeLayers2.gif" alt="J2EE Layers" title="J2EE Layers">

<p>
	<a href="http://struts.apache.org/index.html">Struts</a> -- это каркас/среда разработки web-приложений, 
основанная
	на архитектуре Model 2.
	Эта гибридная архитектура отделяет бизнес-логику и логику отображения настолько, насколько это возможно.
	Struts выполняет это путем выделения бизнес-логики в чистые Java-классы, которые манипулируют вашими данными,
	а также путем предоставления богатой библиотеки тегов, которая может быть использована для отображения ваших 
данных
	при создании JavaServer Pages (JSP).
</p>

<p>
	Struts включает содержит следующие основные функции:
</p>
<ul>
	<li>
		Сервлет-контролер (controller servlet) который координирует запросы к соответствующим Action классам,
		созданным разработчиком приложения.
	</li>
	<li>
		Библиотеками JSP тэгов и их поддержкой в сервлете-контроллере, что помогает разработчикам в создании
		интерактивных web-приложений, основанных на формах .
	</li>
	<li>
		Вспомогательные классы для поддержки разбора (parsing) XML, автоматического наполнения JavaBeans, и
		интернационализации сообщений и запросов.
	</li>
</ul>

<h2>
	<a name="chapterJdbc">Глава 4. Java DataBase Connectivity.</a>
</h2>

<p>
	<a href="http://java.sun.com/products/jdbc/">Java DataBase Connectivity</a>, сокращенно JDBC — Соединение с 
Базой
	Данных на Java — API для языка Java, который определяет методы, с помощью которых клиентское приложение на Java
	осуществляет доступ к базе данных. Если быть точным, то JDBC является торговой маркой, а не аббревиатурой.
</p>
<img src="outsideImages/jdbc.gif" alt="JDBC" title="JDBC">

<p>
	JDBC основана на концепции т. н. драйверов, позволяющих получать соединение с базой данных по специально 
описанному
	URL.
</p>

<p>
	Соединение с базой данных описывается классом, реализующим интерфейс java.sql.Connection.
</p>

<p>
	Имея соединение с базой данных, можно создавать объекты типа Statement, служащие для исполнения запросов к базе
	данных на языке SQL.
</p>

<p>
	Существуют следующие виды типы Statement, различающихся по назначению:
</p>
<ul>
	<li>
		java.sql.Statement — Statement общего назначения.
	</li>
	<li>
		java.sql.PreparedStatement — Statement, служащий для выполнения запросов, содержащих подставляемые параметры
		(обозначаются значком '?' в теле запроса).
	</li>
	<li>
		java.sql.CallableStatement — Statement, предназначенный для вызова хранимых процедур.
	</li>
</ul>

<h2>
	<a name="chapterPostgresql">Глава 5. PostgreSQL</a>
</h2>
<img src="outsideImages/postgresql.gif" alt="postgresql logo" title="postgresql logo">

<p>
	<a href="http://postgresql.org/">PostgreSQL</a> - это объектно-реляционная система управления базами данных 
(ORDBMS)
	(по-русски ОРСУБД или просто СУБД) основанная на POSTGRES, версии 4.2, которая была разработана в Научном
	Компьютерном Департаменте Беркли Калифорнийского Университета. POSTGRES является пионером во многих аспектах,
	которые стали доступны в некоторых коммерческих СУБД много позже.
</p>

<p>
	PostgreSQL - это продукт с открытым исходным кодом, который является потомком оригинального кода, написанного в
	Беркли. PostgreSQL поддерживает большую часть стандарта SQL:2003 и предлагает множество современных 
возможностей:
</p>
<ul>
	<li>комплексные запросы</li>
	<li>внешние ключи</li>
	<li>триггеры</li>
	<li>представления (views)</li>
	<li>транзакционная целостность</li>
	<li>многоверсионное управление параллельным доступом</li>
</ul>

<p>
	Также, возможности PostgreSQL могут быть расширены пользователем путём добавления новых
</p>
<ul>
	<li>типов данных</li>
	<li>функций</li>
	<li>операторов</li>
	<li>агрегатных функций</li>
	<li>индексных методов</li>
	<li>процедурных языков</li>
</ul>

<p>
	Поскольку СУБД PostgreSQL выпускается под либеральной лицензией, её можно бесплатно использовать, модифицировать 
и
	распространять для любых целей, включая личные, коммерческие или академические.
</p>

<h2>
	<a name="chapterUse">Глава 6. Использование этих инструментов в процессе разработки.</a>
</h2>

<p>
	Проект разрабатывается с использованием
</p>

<div style="padding-left: 4em;">
	<ul style="margin-top: 0;">
		<li>
			<a href="http://tomcat.apache.org/">Tomcat</a> v5.5 как servlet-контейнера.
		</li>
		<li>
			<a href="http://subversion.tigris.org/">Subversion</a> с открытым доступом по адресу
			<a href="http://opensvn.csie.org/judgeos/">http://opensvn.csie.org/judgeos/</a>
			как система версионного контроля.
		</li>
		<li>
			<a href="http://ant.apache.org/">Apache Ant</a> v1.6.5, как build-tool.
		</li>
	</ul>
</div>
<ul>
<li>
<h3>Java Servlet</h3>

<p>
	Версия: 2.4
</p>

<p>
	Основные сервлеты: JSP и Struts.
</p>

<p>
	Ниже приведен текст контроллера сервлета, выполняющего регистрацию пользователя
	на сайте (Sign Up). Вкупе с использованием технологии Struts, код выглядит простым и понятным.
</p>
<pre>
	package org.judgeos.controller;

	import org.apache.struts.Globals;
	import org.apache.struts.action.*;
	import org.judgeos.DBFactory;
	import org.judgeos.IncorrectSetupException;
	import org.judgeos.model.Account;

	import javax.servlet.http.HttpServletRequest;
	import javax.servlet.http.HttpServletResponse;
	import java.sql.Connection;
	import java.sql.PreparedStatement;
	import java.sql.SQLException;

	/**
	* Process user registration.
	*/
	public class SignupAction extends Action {


	/**
	* Checks for existence of the same codename in DB and, if so, returns 'failure' forward,
	* else adds the record to the 'account' table and returns 'success' forward. Note that
	* actions to automatically log the user in must be done on 'success' forward.
	* @param mapping
	* @param form
	* @param request
	* @param response
	* @return 'failure' or 'success' forwards
	* @throws Exception
	*/
	public ActionForward execute(
	ActionMapping mapping,
	ActionForm form,
	HttpServletRequest request,
	HttpServletResponse response
	) throws Exception {

	if (Account.codenameExists(request.getParameter(&quot;codename&quot;))) {
	ActionMessage msg = new ActionMessage(&quot;errors.account.codenameUsed&quot;);
	addErrorMessage(msg, request);
	return mapping.findForward(&quot;failure&quot;);
	}

	addAccount(request);

	return mapping.findForward(&quot;success&quot;);
	}


	/**
	* Inserts account row to the 'account' table basing on request parameters data.
	* @param request
	* @throws IncorrectSetupException
	* @throws SQLException
	*/
	private void addAccount(HttpServletRequest request) throws IncorrectSetupException, SQLException {
	Connection c = DBFactory.getDbh();
	String sql = &quot;INSERT INTO account(codename, password, firstName, lastName) &quot; +
	&quot;VALUES(?, ?, ?, ?)&quot;;

	PreparedStatement st = c.prepareStatement(sql);
	st.setString(1, request.getParameter(&quot;codename&quot;));
	st.setString(2, request.getParameter(&quot;password&quot;));
	st.setString(3, request.getParameter(&quot;firstName&quot;));
	st.setString(4, request.getParameter(&quot;lastName&quot;));

	st.execute();
	}


	/**
	* Puts given error to global and SignupForm errors collections.
	* @param msg
	* @param request
	*/
	private void addErrorMessage(ActionMessage msg, HttpServletRequest request) {
	for (String key: new String[]{
	SignupForm.ERROR_KEY, Globals.ERROR_KEY}
	) {
	ActionMessages msgs = (ActionMessages)request.getAttribute(key);
	if (msgs == null) {
	msgs = new ActionErrors();
	msgs.add(&quot;codename&quot;, msg);
	request.setAttribute(key, msgs);
	}
	else {
	msgs.add(&quot;codename&quot;, msg);
	}
	}
	}
	}
</pre>
</li>
<li>
	<h3>Java Server Pages и Java Standard Tag Library</h3>

	<p>
		Версия: JSP v2.0, standart-lib: Jakarta implementation v1.1.2 (JSTL 1.1)
	</p>

	<p>
		Любые страницы, включая статические, реализованы JSP-страницами.
		Активно используется возможность определения "custom" тегов, все теги собираются в библиотеку judgeos.tld
	</p>

	<p>
		Активно используются теги core (c:*), format (fmt:*).
	</p>

	<p>
		На примере первой строкой идет собственный тег &lt;judgeos:fetchLastContests&gt;,
		остальные строки генерируют таблицу, построенную на данных, которые этот тег занес
		в переменную текущего scope с именем, переданном в var.
	</p>
	<pre>
		&lt;judgeos:fetchLastContests var=&quot;lastContests&quot; limit=&quot;10&quot;/&gt;
		&lt;table class=&quot;lastContests&quot;&gt;
		&lt;tr&gt;
		&lt;th&gt;&lt;fmt:message key=&quot;contest.name&quot;/&gt;&lt;/th&gt;
		&lt;th&gt;&lt;fmt:message key=&quot;contest.start&quot;/&gt;&lt;/th&gt;
		&lt;th&gt;&lt;fmt:message key=&quot;contest.stop&quot;/&gt;&lt;/th&gt;
		&lt;/tr&gt;
		&lt;c:forEach items=&quot;${lastContests}&quot; var=&quot;contest&quot;&gt;
		&lt;c:set var=&quot;classHot&quot; value=&quot;&quot;/&gt;
		&lt;c:if test=&quot;${contest.isHot}&quot;&gt;
		&lt;c:set var=&quot;classHot&quot; value=&quot;hot&quot;/&gt;
		&lt;/c:if&gt;
		&lt;tr class=&quot;${classHot}&quot;&gt;
		&lt;td class=&quot;name&quot;&gt;
		&lt;html:link href=&quot;contest/info.jsp?codename=${contest.codename}&quot;
		styleClass=&quot;name&quot;
		&gt;
		&lt;c:out value=&quot;${contest.name}&quot;/&gt;
		&lt;/html:link&gt;
		&lt;/td&gt;
		&lt;td&gt;
		&lt;fmt:formatDate value=&quot;${contest.start}&quot; type=&quot;both&quot;
		timeZone=&quot;UTC&quot;
		pattern=&quot;yyyy-MM-dd HH:mm:ss&quot;
		/&gt;
		&lt;/td&gt;
		&lt;td&gt;
		&lt;fmt:formatDate value=&quot;${contest.stop}&quot; type=&quot;both&quot;
		timeZone=&quot;UTC&quot;
		pattern=&quot;yyyy-MM-dd HH:mm:ss&quot;
		/&gt;
		&lt;/td&gt;
		&lt;/tr&gt;
		&lt;/c:forEach&gt;
		&lt;/table&gt;
	</pre>
</li>
<li>
	<h3>Struts Action Framework</h3>

	<p>
		Версия: 1.2.8.
	</p>

	<p>
		Все запросы "на чтение" имеют окончание '.jsp' либо '/' и реализованы jsp-страницами, остальные -- '.do' и
		реализованы через org.apache.action-интерфейс. Все формы проходят валидацию (validation) средствами Struts,
		все сообщения, допускающие возможность интернационализации, хранятся в стандартных .property файлах.
	</p>

	<p>
		Основной файл для Struts проекта JudgeOS:
	</p>
	<pre>
		&lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot; ?&gt;

		&lt;!DOCTYPE struts-config PUBLIC
		&quot;-//Apache Software Foundation//DTD Struts Configuration 1.2//EN&quot;
		&quot;http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd&quot;&gt;

		&lt;struts-config&gt;

		&lt;form-beans&gt;
		&lt;form-bean
		name=&quot;AccountSignUpForm&quot;
		type=&quot;org.judgeos.controller.SignUpForm&quot;
		/&gt;
		&lt;form-bean
		name=&quot;AccountLogInForm&quot;
		type=&quot;org.judgeos.controller.LogInForm&quot;
		/&gt;
		&lt;/form-beans&gt;


		&lt;global-exceptions&gt;
		&lt;/global-exceptions&gt;

		&lt;global-forwards&gt;
		&lt;forward name=&quot;root&quot; path=&quot;/&quot; /&gt;
		&lt;forward name=&quot;login&quot; path=&quot;/account/login.jsp&quot; /&gt;
		&lt;/global-forwards&gt;


		&lt;action-mappings&gt;
		&lt;action
		path=&quot;/account/signup&quot;
		type=&quot;org.judgeos.controller.SignUpAction&quot;
		name=&quot;AccountSignUpForm&quot;
		scope=&quot;request&quot;
		validate=&quot;true&quot;
		input=&quot;/account/signup.jsp&quot;
		&gt;
		&lt;forward name=&quot;success&quot; path=&quot;/account/login.do&quot;/&gt;
		&lt;forward name=&quot;failure&quot; path=&quot;/account/signup.jsp&quot; /&gt;
		&lt;/action&gt;
		&lt;action
		path=&quot;/account/login&quot;
		type=&quot;org.judgeos.controller.LogInAction&quot;
		name=&quot;AccountLogInForm&quot;
		scope=&quot;request&quot;
		validate=&quot;true&quot;
		input=&quot;/account/login.jsp&quot;
		&gt;
		&lt;forward name=&quot;success&quot; path=&quot;/account/&quot; redirect=&quot;true&quot;/&gt;
		&lt;forward name=&quot;failure&quot; path=&quot;/account/login.jsp&quot; /&gt;
		&lt;/action&gt;
		&lt;action
		path=&quot;/account/logout&quot;
		type=&quot;org.judgeos.controller.LogOutAction&quot;
		&gt;
		&lt;forward name=&quot;success&quot; path=&quot;/&quot; redirect=&quot;true&quot;/&gt;
		&lt;/action&gt;
		&lt;/action-mappings&gt;


		&lt;controller processorClass=&quot;org.apache.struts.tiles.TilesRequestProcessor&quot;/&gt;


		&lt;message-resources parameter=&quot;org.judgeos.MessageResources&quot; /&gt;


		&lt;plug-in className=&quot;org.apache.struts.tiles.TilesPlugin&quot; &gt;
		&lt;set-property
		property=&quot;definitions-config&quot;
		value=&quot;/WEB-INF/tiles-defs.xml&quot;
		/&gt;
		&lt;set-property property=&quot;moduleAware&quot; value=&quot;true&quot; /&gt;
		&lt;/plug-in&gt;

		&lt;plug-in className=&quot;org.apache.struts.validator.ValidatorPlugIn&quot;&gt;
		&lt;set-property
		property=&quot;pathnames&quot;
		value=&quot;/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml&quot;
		/&gt;
		&lt;/plug-in&gt;

		&lt;/struts-config&gt;
	</pre>
</li>
<li>
	<h3>Java DataBase Connectivity</h3>

	<p>
		Версия: 3
	</p>

	<p>
		На данный момент соединение реализовано через класс java.sql.DriverManager, в будущем планируется перейти на
		java.sql.DataSource с перспективой на технологию Hibernate.
	</p>
</li>
<li>
	<h3>PostgreSQL</h3>

	<p>
		Версия: 8.1
	</p>

	<p>
		Схема структуры базы данных, in-development версия (см рисунок):
	</p>
	<img style="float: none;" src="schema.PNG" alt="DB Schema"/>

	<p>
		Здесь таблица <b>account</b> содержит все учетные записи пользователей + одну учетную запись
		codename='guest', представляющая неаутентифицированных пользователей для избежания исключений их обработки.
	</p>

	<p>
		Таблица <b>contest</b> содержит проводимые когда-либо олимпиады. Если contest.publicParticipate=TRUE, это
		значит,
		что любой аутентифицированный пользователь может стать участником олимпиады, иначе допускаются только 
участники,
		занесенные администратором олимпиады в таблицу участников олимпиады (contestMember).
	</p>

	<p>
		Таблица <b>contestMember</b> содержит участников олимпиады. Стоит заметить, что под участником понимается не
		только
		соревнующаяся команда, но также члены жюри(либо их команда), администраторы олимпиады, тренеры и другие
		пользователи олимпиады. Их права(роли) представлены в таблице <b>contestMemberRole</b>. Участник олимпиады
		не обязательно должен иметь account в системе JudgeOS, что позволяет избежать необходимости регистрироваться
		дважды для участников олимпиады.
	</p>
</li>
<li>
	Также в проекте использованы некоторые другие технологии, например Enterprise JavaBeans (EJB),
	Java Naming and Directory Interface (JNDI), не описанные в данном документе.
</li>
</ul>

<h2>
	<a name="chapterForever">Глава 7. Дальнейшее развитие проекта.</a>
</h2>

<p>
	В процессе дальнейшей разработки планируется воспользоваться возможностями
	<a href="http://struts.apache.org/struts-action/struts-tiles/index.html">Tiles</a> для модулирования 
View-структуры;
	осуществлять взаимодействие с системой управления базами данных через java.sql.DataSource класс, возможно 
используя
	JNDI для определения аргументов подключения.
</p>

<p>
	Также будет рассмотрена возможность перехода проекта на платформу разработки <a
	href="http://www.springframework.org/">Spring</a>,
	с использованием технологии <a href="http://www.hibernate.org/">Hibernate</a>.
</p>

<h2>
	<a name="chapterSummary">Заключение</a>
</h2>

<p>
	В данной работе была спроектирована базовая структура системы управления ACM-ICPC олимпиадой с использованием 
набора
	технологий J2EE. В процессе разработки были детально рассмотрены и использованы каждая из них.
</p>

<h2>
	<a name="enclosureCode">Приложение A: Исходный код проекта JudgeOS.</a>
</h2>

<p>
	Диск содержит все файлы проекта, а также некоторые продукты, использованные в разработке.
</p>
</body>
</html>